tg-me.com/BookPython/3639
Last Update:
Создание объекта в Python включает два ключевых этапа. Сначала вызывается метод __new__
, который создаёт и возвращает новый объект. Затем вызывается метод __init__
для инициализации состояния этого объекта.
Однако, если __new__
возвращает объект, который не является экземпляром исходного класса, метод __init__
не будет вызван. Это связано с тем, что возвращаемый объект, вероятно, уже создан другим классом, и его __init__
уже был выполнен:
class Foo:
def __new__(cls, x):
return dict(x=x)
def __init__(self, x):
print(x) # Никогда не вызывается
print(Foo(0))
Важно: не следует создавать экземпляры того же класса в
__new__
с использованием обычного конструктора (Foo(...)
). Это может привести к двойному вызову __init__
или даже к бесконечной рекурсии.Пример бесконечной рекурсии:
class Foo:
def __new__(cls, x):
return Foo(-x) # Рекурсия
Пример двойного вызова
__init__
:
class Foo:
def __new__(cls, x):
if x < 0:
return Foo(-x)
return super().__new__(cls)
def __init__(self, x):
print(x)
self._x = x
Правильный способ:
class Foo:
def __new__(cls, x):
if x < 0:
return cls.__new__(cls, -x)
return super().__new__(cls)
def __init__(self, x):
print(x)
self._x = x
👉@BookPython
BY Библиотека Python разработчика | Книги по питону
Warning: Undefined variable $i in /var/www/tg-me/post.php on line 283
Share with your friend now:
tg-me.com/BookPython/3639